package com.calvin.study.threadsafe.lock.eightlock;

import java.util.concurrent.TimeUnit;


public class LockTest2 {

	public static void main(String[] args) {
		LockTest2 lt = new LockTest2();
		//3、增加一个普通方法后，先执行“发短信”还是普通方法？ 3/普通方法
		//lt.test3();
		
		//4、两个对象，两个同步方法，执行顺序是什么？ 4/打电话 发短信 
		//原因 ：synchronized 锁的对象是 该方法的调用者！
		//test4中可以，phone phone2为两个对象，两个调用者，即两把锁，那么锁有创建时间的先后顺序，先到先得。
		lt.test4();
	}
	
	
	public void test3() {
		System.out.println("====================test3====================");
		Phone2 phone = new Phone2();

		new Thread(() -> {
			phone.sendSms();
		}, "A").start();

		new Thread(() -> {
			phone.hello();
		}, "B").start();
	}

	public void test4() {
		System.out.println("====================test4====================");
		//两个对象，两个调用者，两把锁！
		Phone2 phone = new Phone2();
		Phone2 phone2 = new Phone2();

		new Thread(() -> {
			phone.sendSms();
		}, "A").start();

		new Thread(() -> {
			phone2.call();
		}, "B").start();
	}
}

class Phone2 {
	// synchronized 锁的对象是 该方法的调用者！
	public synchronized void sendSms() {
		try {
			TimeUnit.SECONDS.sleep(3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("发短信");
	}

	public synchronized void call() {
		System.out.println("打电话");
	}

	// 这里没有锁！不是同步方法，不受锁的影响
	public void hello() {
		System.out.println("hello");
	}
}